Die erste Grafikkarte die IBM verkaufte war dieser Color Graphics Adapter aus dem Jahre 1981.
Für anfangs 1000DMark bekam man bis zu 16 Farben und hatte ganze 16 KB Videospiecher.
Die Grafikauflösung betrug bis zu 640x200 Pixel, aber dann nur mit zwei Farben. Alle 16 Farben
konnte man allerdings nur im Textmodus gleichzeitig nutzen. Und dieser Textmodus ist auch bei den
Nachfolgern Enhanced Graphics Adapter, EGA und Video Graphics Array, VGA bestehen geblieben und
wird von heutigen Systemen im Allgemeinen auch noch unterstützt. Wir haben in diesem Textmodus
25 Zahlen mit je 80 Zeichen zur Verfügung, können also 2000 Zeichen gleichzeitig am Bildschirm
anzeigen. Für jedes Zeichen brauchen wir dabei zwei Bytes. Das erste davon beinhaltet das
darzustellende Zeichen selbst. Der dazu verwendete Zeichensatz CodePage 437 trifft die druckbaren
ASCII Zeichen. In ASCII sind die ersten 32 Codes allerdings nicht druckbare Steuerzeichen,
wie beispielsweise die 10 für den Zeilenumbruch. Wenn wir hier diesen Wert als erstes Byte setzen,
sehen wir jedoch einen Block mit einem Kreis, denn alle Werte haben im Zeichensatz eine grafische
Repräsentation. Das zweite Byte dient der Konfiguration der Darstellung. Neben Spezialeffekten
wie dem Blinken kann man damit die Farben steuern. Von den 16 Farben stehen als Hintergrundfarbe nur
die ersten 8 zur Verfügung. Da sind allerdings alle relevanten Farben mit dabei, die anderen sind
eigentlich nur aufgehellte Farbvarianten, welche nur bei der Vordergrundfarbe verwenden können.
Der Videospeicher für diese Bytes ist in unserem Arbeitsspeicher eingeblendet ab Adresse 0xb8000.
Ein an die erste Adresse gespeichertes Byte, hier das B, wird an der ersten Stelle mit dem
nachfolgenden spezifizierten Darstellungsattribut eingeblendet. Das Byte an der Adresse 0xb80002
entspricht dann dem zweiten Zeichen am Bildschirm. Der hier dargestellte Speicher würde am Bildschirm
in rot das Wort bar auf hellgrauen Hintergrund ausgeben, wobei das erste Zeichen blinken wird.
Bitte beachten, das Blinken wird nicht zwangsläufig im Emulator dargestellt,
da das höchstwertige Bit auch anders interpretiert werden kann. Aber die Farben sollten übereinstimmen.
Um jetzt das Darstellungsattribut nach unserem Wünschen zu setzen, kann man die im Grundstudium
gelernten Bit-Aparationen verwenden. Bitwise ist und, oder, exklusiv ist oder, Negation,
sowie das Schiften. Um eine bessere Lesbarkeit zu ermöglichen, sollte man jedoch nicht wie hier die
dezimale Repräsentation verwenden, besser Hexwerte oder konstante Variable mit entsprechenden Namen.
Um jetzt beispielsweise in einer Variable x das EnteBit zu setzen oder zu löschen,
verwende man in der Regel diese gut lesbaren Konstrukte. Noch lesbarer sind allerdings Bitfelder.
Felder in Strukturen können mit einer Länge definiert werden, hier FG für foreground mit
4-Bit und background mit 3-Bit sowie blink mit einem Bit. Der Zugriff ist dann wie bei Strukturen
üblich, in Verbindung mit Inams eine intuitive Art die Attribute zu definieren. Die gesetzten
Werte entsprechen dann einem Byte mit diesem Speicherlayout. Das erste Feld foreground beginnt
beim niedrigwertigsten Bit. Nach dem C-Standard ist die Reihenfolge übrigens nicht spezifiziert,
aber auf dem x86 bilden alle relevanten Übersetzer das Wien-Beispiel ab. Allerdings gibt es bei
Strukturen Fallstriche die man wissen sollte, wenn man eine gewisse Darstellung im Speicher
erwartet. Diese Struktur hat ein CharArray, drei Elemente zu je ein Byte, ein Integer,
welcher auf der x86 Architektur 4-Byte belegt, sowie ein Pool, welcher wieder ein Byte braucht.
Somit haben wir 8 Byte an Nutzdaten, allerdings belegt es 12 Bytes. Grundsinn Fullbytes,
die der Übersetzer einbaut, dadurch ausgerichtete Werte führen zu einem schnelleren Zugriff.
Aber wenn wir ein bestimmtes Layout im Speicher brauchen, können wir den Übersetzer instruieren,
solche Optimierungen zu unterlassen, und zwar durch die Attributierung packed. Nun hat die
Struktur die erwartete Größe. Da solche Fehler, eine Struktur hat nicht die gewordene Größe,
gar nicht so einfach zu erkennen sind, empfiehlt es sich in solchen Fällen eine statische
Zusicherung anzugeben. Hiermit wird beim Übersetzen die Größe geprüft und bei einem Fehler abgebrochen.
Es wird mit diesen Zusicherungen kein Code erzeugt, es hat somit keine Auswirkung auf
die eigentliche Laufzeit und darf entsprechend reichlich verwendet werden.
Zurück zum Bildschirm. Um die aktuelle Position bei der Texteingabe zu sehen,
ist eine Schreibmarke, auch Cursor genannt, hilfreich. Die Position können wir natürlich
einfach in einer Variable speichern. Oder wir nehmen die entsprechende Funktionalität in unserer
Presenters
Zugänglich über
Offener Zugang
Dauer
00:08:34 Min
Aufnahmedatum
2020-07-29
Hochgeladen am
2020-10-16 16:46:50
Sprache
de-DE
Bildschirmausgabe mittels CGA Textmode für Aufgabe 1 der Lehrveranstaltung Betriebssysteme.
Folien und Transkript zum Video.